package com.fit.utils.se;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

/**
 * 空 验证工具
 * @author hcl
 *
 */
public class EmptyUtils {

	
	/**
	 * 判断当前的单例集合是否为空 ，coll 等于null或长度等于0 返回true，否则返回false
	 * 
	 * @param coll
	 * @return
	 */
	public static boolean isEmpty(Collection<?> coll) {
		return coll == null || coll.isEmpty();
	}

	/**
	 * 判断单例集合是否不为空 coll 不为null并且长度不等于0返回true,否则返回false
	 * 
	 * @param coll
	 * @return
	 */
	public static boolean isNotEmpty(Collection<?> coll) {
		return !EmptyUtils.isEmpty(coll);
	}

	/**
	 * 判断当前的集合是否为空 map等于null或长度等于0 返回true，否则返回false
	 * 
	 * @param coll
	 * @return
	 */
	public static boolean isEmpty(Map<?, ?> map) {
		return map == null || map.isEmpty();
	}

	/**
	 * 判断map是否不为空 map不为null并且长度不等于0返回true,否则返回false
	 * 
	 * @param map
	 * @return
	 */
	public static boolean isNotEmpty(Map<?, ?> map) {
		return !EmptyUtils.isEmpty(map);
	}

	/**
	 * 判断当前字符串是否为空 str 等于null或等于""(会去掉前后空格) 返回true，否则返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		return str == null || str.trim().length() == 0;
	}

	/**
	 * 判断字符串是否不为空 str不为null并且不等于""(会去掉前后空格) 返回true,否则返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		return !EmptyUtils.isEmpty(str);
	}

	/**
	 * 判断数组 或 其他类型对象是否为空
	 * 如果是 数组 ： obj等于null或者obj的长度等于0 返回true,否则返回false
	 * 如果是 单列集合 ： obj 等于null或长度等于0 返回true，否则返回false
	 * 如果是 Map集合 ：  obj等于null或长度等于0 返回true，否则返回false
	 * 如果是 String : obj 等于null或等于""(会去掉前后空格) 返回true，否则返回false
	 * 如果是其他对象, obj等于null 返回true ,否则返回false
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj){
		if(obj == null){
			return true;
		}
		if(obj.getClass().isArray()){
			//判断是否是数组
			return Array.getLength(obj) == 0 ? true : false;
		}else if(obj instanceof Collection){
			//判断是否是单列集合
			return EmptyUtils.isEmpty((Collection<?>)obj);
		}else if(obj instanceof Map){
			//判断是否是Map集合
			return EmptyUtils.isEmpty((Map<?,?>)obj);
		}else if(obj instanceof String){
			//判断是否是字符串
			return EmptyUtils.isEmpty((String)obj);
		}
		return false;
	}
	
	
	/**
	 * 判断数组 或 其他类型对象是否不为空
	 * 如果是 数组 ： obj等于null或者obj的长度等于0 返回false,否则返回true
	 * 如果是 单列集合 ： obj 等于null或长度等于0 返回false，否则返回true
	 * 如果是 Map集合 ：  obj等于null或长度等于0 返回false，否则返回true
	 * 如果是 String : obj 等于null或等于""(会去掉前后空格) 返回false，否则返回true
	 * 如果是其他对象, obj等于null 返回false ,否则返回true
	 * @param obj
	 * @return
	 */
	public static boolean isNotEmpty(Object obj){
		return !EmptyUtils.isEmpty(obj);
	}
	
	
	/**
	 * 当数组长度为0或者数组中的每一个元素都为null时返回true
	 * @param objs
	 * @return
	 */
	public static boolean isEmptys(Object... objs){
		if(EmptyUtils.isNotEmpty((Object)objs)){
			for(Object obj : objs){
				if(EmptyUtils.isNotEmpty(obj)){
					return false;
				}
			}
			return true;
		}
		return true;
	}
	
	/**
	 * 当数组长度大于0并且数组中所有元素都不为null时返回true
	 * @param objs
	 * @return
	 */
	public static boolean isNotEmptys(Object... objs){
		if(EmptyUtils.isNotEmpty((Object) objs)){
			for(Object obj : objs){
				if(EmptyUtils.isEmpty(obj)){
					return false;
				}
			}
			return true;
		}
		return false;
	}
	
}
